//
// Created by 施旗坤 on 2025/11/8.
//
//

#include "admin_show.h"
#include "admin_function.h"

// 展示所有图书信息的函数
// 功能：查询并格式化展示book表中所有图书的详细信息（ID、名称、作者等），返回0表示成功，-1表示失败
int show_book(){
    // 定义SQL查询语句：查询book表中所有字段的记录 count不能被修改
    const char * show_sql="select * from book";
    sqlite3_stmt * show_stmt;  // 预编译语句句柄

    // 预编译SQL语句：将查询语句编译为可执行的字节码
    int rc= sqlite3_prepare_v2(db,show_sql,-1,&show_stmt,NULL);
    if (rc!=SQLITE_OK){  // 预编译失败处理
        fprintf(stderr,"预编译展示失败%s\n", sqlite3_errmsg(db));  // 输出错误信息
        sqlite3_finalize(show_stmt);  // 释放句柄资源
        return -1;
    }

    // 执行查询并获取第一行结果（SQLITE_ROW表示存在结果行，SQLITE_DONE表示无结果）
    rc= sqlite3_step(show_stmt);
    int row_count=0;  // 用于统计查询到的图书总数

    // 打印表头：定义表格格式，包含图书各字段的标题
    printf("\n======= 图书信息列表 =======\n");
    printf(
            "+----+----------------+----------------+--------+----------------+------------+----------+-------+\n"
            "| ID | 图书名称\t| 作者\t| 价格\t| 出版社\t| 出版日期\t| 分类ID\t| 库存\t|\n"
            "+----+----------------+----------------+--------+----------------+------------+----------+-------+\n"
    );

    // 循环遍历所有查询结果行（只要返回SQLITE_ROW就继续处理）
    while (rc==SQLITE_ROW){//获取每一行有效结果
        row_count++;  // 每处理一行，图书数量+1

        // 提取当前行各字段的值（根据book表字段顺序，索引从0开始）。
        int id= sqlite3_column_int(show_stmt,0);  // 0: 图书ID（整数）从查询结果的当前行中提取获取文本类型（字符串）列数据.。
        const char * book_name= (const char *)sqlite3_column_text(show_stmt,1);  // 常量字符的指针1: 图书名称（文本）
        const char * author= (const char *)sqlite3_column_text(show_stmt,2);  // 2: 作者（文本）
        double price= sqlite3_column_double(show_stmt,3);  // 3: 价格（浮点数）
        const char * publish= sqlite3_column_text(show_stmt,4);  // 4: 出版社（文本）
        const char * publish_date= sqlite3_column_text(show_stmt,5);  // 5: 出版日期（文本）
        int category_id= sqlite3_column_int(show_stmt,6);  // 6: 分类ID（整数）
        int stock= sqlite3_column_int(show_stmt,7);  // 7: 库存数量（整数）

        // 格式化打印当前行数据：
        // 用%-Nd控制字段宽度和左对齐，.Ns限制字符串最大长度，避免格式错乱；
        // 用三元运算符处理NULL值（字段为空时显示“未知”）
        printf(
                "| %-2d | %-10s | %s\t | %.2f | %s\t | %s\t | %d\t | %d\t |\n",
                id,
                book_name ? book_name : "未知",  // 处理图书名称为NULL的情况
                author ? author : "未知",        // 处理作者为NULL的情况
                price,
                publish ? publish : "未知",      // 处理出版社为NULL的情况
                publish_date ? publish_date : "未知",  // 处理出版日期为NULL的情况
                category_id,
                stock
        );

        // 继续获取下一行结果 获取每一行的代码
        rc = sqlite3_step(show_stmt);
    }

    // 打印表尾，与表头格式对应，闭合表格
    printf(
            "+----+----------------+----------------+--------+----------------+------------+----------+-------+\n"
    );

    if (rc!=SQLITE_DONE){
        fprintf(stderr,"查询结果遍历失败：%s\n", sqlite3_errmsg(db));  // 输出错误信息
        sqlite3_finalize(show_stmt);  // 释放资源
        return -1;  // 返回错误码
    }

    // 释放预编译语句句柄资源
    sqlite3_finalize(show_stmt);

    // 根据查询到的图书数量，输出统计信息
    if (row_count == 0) {
        printf("当前没有任何图书信息\n");
    } else {
        printf("共展示 %d 本图书信息\n", row_count);
    }

    return 0;  // 函数执行成功
}

// 展示所有用户的借阅记录的函数
// 功能：通过关联查询borrow_record（借阅记录）和book（图书）表，格式化展示借阅详情，返回0表示成功，-1表示失败















int show_user() {
    // 定义SQL查询语句：关联两张表获取完整借阅信息
    // 左连接(left join)特性：即使book表中无对应图书记录，借阅记录仍会显示（图书相关字段为NULL）
    const char *sql =
            "select "
            "   br.record_id, "         // 0: 借阅记录唯一ID（来自borrow_record表，简称br）
            "   br.user_id, "           // 1: 借阅用户ID（来自br表，关联前端用户表的id）
            "   br.book_name, "         // 2: 借阅图书名称（来自br表，作为关联book表的条件）
            "   b.author, "             // 3: 图书作者（来自book表，简称b）
            "   b.publish, "            // 4: 图书出版社（来自b表）
            "   b.price, "              // 5: 图书价格（来自b表，数值类型）
            "   br.borrow_time, "       // 6: 借阅时间（来自br表，格式通常为字符串日期）
            "   br.due_time, "          // 7: 应还时间（来自br表，借阅规则约定的归还期限）
            "   br.status, "            // 8: 借阅状态（来自br表，0=未归还，1=已归还）
            "   br.return_time "        // 9: 实际归还时间（来自br表，已归还时才有值，未归还为NULL）
            "from borrow_record br "    // 主表：借阅记录表，别名br
            "left join book b "         // 关联表：图书表，别名b；左连接保证借阅记录不丢失
            "on br.book_name = b.book_name; ";  // 连接条件：两张表的图书名称一致

    sqlite3_stmt *stmt;  // SQLite预编译语句句柄，用于处理SQL的编译和执行

    // 预编译SQL语句：将SQL字符串转换为SQLite可执行的字节码（提高执行效率，避免SQL注入）
    int rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
    if (rc != SQLITE_OK) {  // 预编译失败判断（如SQL语法错误、表不存在等）
        printf("预编译SQL失败: %s\n", sqlite3_errmsg(db));  // 输出具体错误信息
        return -1;  // 直接返回错误码，无需释放句柄（预编译失败时stmt可能未初始化）
    }

    // 执行预编译语句，获取第一行查询结果
    // 返回值SQLITE_ROW表示查询到数据，SQLITE_DONE表示无数据或查询结束
    rc = sqlite3_step(stmt);
    int record_count = 0;  // 统计查询到的借阅记录总数

    // 打印表头：采用固定格式的表格，确保字段对齐，提升可读性
    printf("\n======= 所有用户的借阅记录 =======\n");
    printf(
            "+----------+--------+----------------+----------------+----------------+--------+---------------------+---------------------+--------+---------------------+\n"
            "| 记录ID   | 用户ID | 图书名称       | 作者           | 出版社         | 价格   | 借阅时间            | 应还时间            | 状态   | 归还时间            |\n"
            "+----------+--------+----------------+----------------+----------------+--------+---------------------+---------------------+--------+---------------------+\n"
    );

    while (rc == SQLITE_ROW) {
        record_count++;
        // 提取字段值：新增 return_time（索引9）
        int record_id = sqlite3_column_int(stmt, 0);
        int uid = sqlite3_column_int(stmt, 1);
        const char *book_name = (const char *)sqlite3_column_text(stmt, 2);
        const char *author = (const char *)sqlite3_column_text(stmt, 3);
        const char *publish = (const char *)sqlite3_column_text(stmt, 4);
        double price = sqlite3_column_double(stmt, 5);
        const char *borrow_time = (const char *)sqlite3_column_text(stmt, 6);
        const char *due_time = (const char *)sqlite3_column_text(stmt, 7);
        int status = sqlite3_column_int(stmt, 8);
        const char *return_time = (const char *)sqlite3_column_text(stmt, 9);  // 新增归还时间

        const char *status_str = (status == 0) ? "未还" : "已还";

        // 打印一行记录：新增归还时间列（处理NULL值，未归还时显示“未归还”）
        printf(
                "| %-8d | %-6d | %-14s | %-14s | %-20s | %-6.2f | %-19s | %-19s | %-6s | %-19s |\n",
                record_id,
                uid,
                book_name ? book_name : "未知",
                author ? author : "未知",
                publish ? publish : "未知",
                price,
                borrow_time ? borrow_time : "无记录",
                due_time ? due_time : "无记录",
                status_str,
                return_time ? return_time : "未归还"  // 未归还时显示“未归还”
        );
        rc = sqlite3_step(stmt);
    }

    // 打印表尾：同步新增一列的分隔符
    printf(
            "+----------+--------+----------------+----------------+----------------+--------+---------------------+---------------------+--------+---------------------+\n"
    );

    if (rc != SQLITE_DONE) {
        fprintf(stderr, "查询失败: %s\n", sqlite3_errmsg(db));
        sqlite3_finalize(stmt);
        return -1;
    }

    if (record_count == 0) {
        printf("当前无任何用户的借阅记录\n");
    } else {
        printf("共查询到 %d 条借阅记录\n", record_count);
    }
    sqlite3_finalize(stmt);
    return 0;
}
